#ifndef __RN8209_H
#define __RN8209_H

#include "UI_Gauge_SPI.h"
#ifdef UsingFreeRTOS
#include "FreeRTOS.h"
#include "task.h"
#endif

//------------ RN8209 寄存器地址定义-------------//
// 校准寄存器：都具备写保护特性。
#define					SYSCON            0x00         // 默认值 = 0003H; 系统控制寄存器
#define					SYSCON_Len        2
#define        	EMUCON            0x01         // 默认值 = 0003H; 计量控制寄存器
#define        	EMUCON_Len        2
#define        	HFConst     	    0x02         // 默认值 = 1000H; 脉冲频率寄存器
#define        	HFConst_Len     	2 
#define        	PStart      	    0x03         // 默认值 = 0060H; 有功起动功率 
#define        	PStart_Len      	2 
#define        	QStart      	    0x04         // 默认值 = 0120H; 无功起动功率
#define        	QStart_Len      	2 
#define					GPQA        	    0x05         // 默认值 = 0000H; 通道A功率增益补偿
#define					GPQA_Len        	2 
#define        	GPQB        	    0x06         // 默认值 = 0000H; 通道B功率增益补偿
#define        	GPQB_Len        	2 
#define        	PhsA        	    0x07         // 默认值 = 00H; 通道A相位补偿
#define        	PhsA_Len        	1 
#define        	PhsB        	    0x08         // 默认值 = 00H; 通道B相位补偿
#define        	PhsB_Len        	1
#define					QPhsCal				    0x09         // 默认值 = 0000H; 无功相位补偿 
#define					QPhsCal_Len				2 
#define					APOSA 				    0x0a         // 默认值 = 0000H; 通道A有功功率offset补偿
#define					APOSA_Len 				2
#define        	APOSB 				    0x0b         // 默认值 = 0000H; 通道B有功功率offset补偿
#define        	APOSB_Len 				2
#define        	RPOSA 				    0x0c         // 默认值 = 0000H; 通道A无功功率offset补偿
#define        	RPOSA_Len 				2
#define        	RPOSB 				    0x0d         // 默认值 = 0000H; 通道B无功功率offset补偿
#define        	RPOSB_Len 				2
#define        	IARMSOS     	    0x0e         // 默认值 = 0000H; IA有效值offset补偿
#define        	IARMSOS_Len     	2
#define        	IBRMSOS     	    0x0f         // 默认值 = 0000H; IB有效值offset补偿
#define        	IBRMSOS_Len     	2
#define        	IBGain          	0x10         // 默认值 = 0000H; IB增益设置
#define        	IBGain_Len      	2

// 计量数据寄存器
#define					PFCnt    	        0x20         // 默认值 = 0000H; 快速有功脉冲计数，写保护
#define					PFCnt_Len    	    2 
#define        	QFCnt    	        0x21         // 默认值 = 0000H; 快速无功脉冲计数，写保护
#define        	QFCnt_Len    	    2
#define        	IARMS           	0x22         // 默认值 = 000000H; 电流A有效值
#define        	IARMS_Len       	3
#define        	IBRMS       	    0x23         // 默认值 = 000000H; 电流B有效值
#define        	IBRMS_Len       	3
#define        	URMS        	    0x24         // 默认值 = 000000H; 电压有效值
#define        	URMS_Len        	3
#define					UFreq       	    0x25         // 默认值 = 0000H; 电压频率
#define					UFreq_Len       	2
#define        	PowerPA     	    0x26         // 默认值 = 00000000H; 有功功率A
#define        	PowerPA_Len     	4
#define        	PowerPB     	    0x27         // 默认值 = 00000000H; 有功功率B
#define        	PowerPB_Len     	4
#define        	PowerQ      	    0x28         // 默认值 = 00000000H; 无功功率
#define        	PowerQ_Len      	4
#define         EnergyP  	        0x29         // 默认值 = 000000H; 有功能量，读后不清0
#define         EnergyP_Len  	    3
#define         EnergyP2 	        0x2a         // 默认值 = 000000H; 有功能量，读后清0
#define         EnergyP2_Len 	    3
#define         EnergyQ  	        0x2b         // 默认值 = 000000H; 无功能量，读后不清0
#define         EnergyQ_Len  	    3 
#define         EnergyQ2    	    0x2c         // 默认值 = 000000H; 无功能量，读后清0
#define         EnergyQ2_Len    	3
#define         EMUStatus   	    0x2d         // 默认值 = 00EE79H; 计量状态及检验和寄存器
#define         EMUStatus_Len   	3

// 中断及中断状态寄存器
#define         IE  		          0x40         // 默认值 = 00H; 中断允许寄存器，写保护
#define         IE_Len  		      1
#define         IF  		          0x41         // 默认值 = 00H; 中断标志寄存器，读后清0
#define         IF_Len  		      1
#define         RIF    	          0x42         // 默认值 = 00H; 复位中断状态，读后清0
#define         RIF_Len    	      1

// 系统状态寄存器
#define         SysStatus  	      0x43         // 默认值 = --; 系统状态；上电复位后置1，被读取后置0
#define         SysStatus_Len  	  1
#define         RData      	      0x44         // 默认值 = --; 上次读出的数据
#define         RData_Len      	  4
#define         WData      	      0x45         // 默认值 = --; 上次写入的数据        
#define         WData_Len      	  2
#define         DeviceID   	      0x7f         // 默认值 = 820900H;
#define         DeviceID_Len   	  3                

// 命令寄存器
#define         CommandRegAddr    0xEA          

//------------- End RN8209  地址定义 ----------------//

//--------------- RN8209 校表参数-------------//
#define   PStartValueDef             0x0060
#define   QStartValueDef             0x0120
#define		HFConstValue1			         0x0B		  
#define		HFConstValue2			         0x54		
#define		GPQAValue1			           0x00		  
#define		GPQAValue2		  	         0x00		
#define		IARMSOSValue1			         0x00		  
#define		IARMSOSValue2		  	       0x00		

//------------ End RN8209 常量定义-------------//


//------------ RN8209 常量定义----------------//
#define		Con_EC_Power			    5		  //3200=100*2^5
#define		Con_EC_Const		      12		//1200imp/kWh
#define   Gauges_IC             RN8209   // SM801 RN8209

// 电表常数
// 电压电流有效值参数
#define    K_URMS                0.00011403330634622                        //0.0018550872802734375/17.0 * 1.045      // 1.0 / 8388608 * 1621  * 96 / 10
#define    K_IRMS                0.00000607315806369236                     //0.0005531432364411/91.08       // 20 * 1.0 / 36157
#define    K_POWERPA             0.0000227369436929603
#define    K_EC                  0.00876193040880324                        // 0.00887636379972558  // 0.129083004289955  // K_EC = 1 / EC; EC = 电表常数
#define    err_power             50

//------------ End RN8209 常量定义-------------//



//----------------- 命令字 ----------------//
// 写使能
#define	  Con_WrEn	            0xE5
// 写保护
#define	  Con_WrDis	            0xDC
// 选择电流通道A
#define	  Con_ChannelsA	        0x5A
// 选择电流通道B
#define	  Con_ChannelsB	        0xA5
// 复位指令:指令复位
#define	  Con_Reset		          0xFA	

//--------------- END:命令字 ----------------//



//------------ RN8209 全局变量  -------------//
//extern unsigned char readAddr;
//extern uint8_t     rdDatasLen;
extern uint8_t	  rnCheckTimes;
extern uint16_t	  rnCheckSUM;
extern uint16_t	  rnCheckSUMRead;
extern uint8_t    rnDeviceID[3];
extern uint8_t    rnIF;

//------------ RN8209 函数  -------------//
void RN_WriteCommand(unsigned char CmdWord);
void RN_WriteDatas(uint8_t Addr,uint8_t *datas,uint8_t datalen);
void RN_ReadDatas(uint8_t Addr,uint8_t datalen);
void RN_Set_Regulation(void);



#endif

